"""
数据库配置文件 (database.py)

配置SQLAlchemy ORM与MySQL的连接。
从环境变量加载数据库配置。
"""
import os
from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker, scoped_session
from dotenv import load_dotenv

# 加载环境变量
load_dotenv()

# 从环境变量中读取数据库配置
DB_HOST = os.environ.get('MYSQL_HOST', 'localhost')
DB_PORT = os.environ.get('MYSQL_PORT', '3306')
DB_USER = os.environ.get('MYSQL_USER', 'root')
DB_PASSWORD = os.environ.get('MYSQL_PASSWORD', '')
DB_NAME = os.environ.get('MYSQL_DB', 'memeking')

# 创建数据库连接URL
DB_URL = f"mysql+pymysql://{DB_USER}:{DB_PASSWORD}@{DB_HOST}:{DB_PORT}/{DB_NAME}?charset=utf8mb4"

# 创建SQLAlchemy引擎
engine = create_engine(
    DB_URL,
    pool_size=10,
    max_overflow=20,
    pool_recycle=3600,
    pool_pre_ping=True,
    echo=False  # 设置为True可以查看SQL语句
)

# 创建会话工厂
SessionFactory = sessionmaker(autocommit=False, autoflush=False, bind=engine)

# 创建线程安全的会话
db_session = scoped_session(SessionFactory)

# 创建声明性基类
Base = declarative_base()
Base.query = db_session.query_property()

def init_db():
    """初始化数据库，创建所有表"""
    # 导入所有模型以确保它们被包含在元数据中
    import models.db_models
    Base.metadata.create_all(bind=engine)

def get_db():
    """获取数据库会话"""
    try:
        session = db_session()
        yield session
    finally:
        session.close() 